package com.berchen.test;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import java.lang.reflect.Proxy;

/**
 * 代理
 */
public class ProxyDemo {

    public static void main(String[] args) {

        /**
         * 动态代理
         */
        TestProxy dailiduixiang = (TestProxy) Proxy.newProxyInstance(ZiTestProxy.class.getClassLoader(),
                ZiTestProxy.class.getInterfaces(),
                (proxy, method, args1) -> {
                    // 执行目标方法
                    method.invoke(new ZiTestProxy(), args1);
                    return proxy;
                });
        dailiduixiang.test(21);


        /**
         * cglib的动态代理
         */
        TestEnhancer testEnhancer = (TestEnhancer) Enhancer.create(TestEnhancer.class,
                (MethodInterceptor) (o, method, objects, methodProxy) -> {
                    // 执行目标方法
                    method.invoke(new TestEnhancer(), objects);
                    return o;
                });
        testEnhancer.test(1122);
    }
}

/**
 * cglib代理的对象不能是最终类
 */
class TestEnhancer {

    void test(int i) {
        System.out.println(i);
    }
}

/**
 * proxy 代理的对象必须实现接口
 */
class ZiTestProxy implements TestProxy {

    @Override
    public void test(int i) {
        System.out.println(i);
    }
}

interface TestProxy {

    void test(int i);
}
